#include "protreethread.h"
#include <QDir>
#include "protreeitem.h"
#include "const.h"
#include <QDebug>

ProTreeThread::ProTreeThread(const QString &src_path, const QString &dist_path, QTreeWidgetItem *parent_item,
                             int file_count, QTreeWidget *self, QTreeWidgetItem *root, QObject *parent)
    : QThread(parent), _src_path(src_path), _dist_path(dist_path), _file_count(file_count),
    _parent_item(parent_item), _self(self),_root(root), _bstop(false)
{

}

ProTreeThread::~ProTreeThread()
{

}

void ProTreeThread::run()
{
    qDebug()<< "CreateProTree(_src_path, _dist_path, _parent_item, _file_count, _self, _root);";
    CreateProTree(_src_path, _dist_path, _parent_item, _file_count, _self, _root);    // 调用创建树的程序
    if(_bstop){
        auto path = dynamic_cast<ProTreeItem*>(_root)->GetPath();
        auto index = _self->indexOfTopLevelItem(_root);         // 获取根节点的索引
        delete _self->takeTopLevelItem(index);          // 根据索引进行删除
        QDir dir(path);
        dir.removeRecursively();        // 递归的删除目录树
        qDebug( ) << "目录树删除成功";
        return ;
    }
    qDebug() << "线程调用结束" ;

    emit SigFinishProgress(_file_count);        // 发送进度完成信号
}

void ProTreeThread::CreateProTree(const QString &src_path, const QString &dist_path, QTreeWidgetItem *parent_item, int &file_count, QTreeWidget *self, QTreeWidgetItem *root, QTreeWidgetItem *preItem)
{
    if(_bstop){         // 线程停止逻辑
        return ;
    }

    bool needcopy = true;       // 是否需要拷贝，默认为true
    if(src_path == dist_path){      // 原路径等于目的路径
        needcopy = false;
    }

    QDir import_dir(src_path);
    QStringList nameFilters;
    import_dir.setFilter(QDir::Dirs | QDir::Files | QDir:: NoDotAndDotDot);     // 需要文件夹、文件、". "和 ".." , 其他的都过滤掉
    import_dir.setSorting(QDir::Name);          // 按文件夹的名字进行排序

    QFileInfoList list = import_dir.entryInfoList();
    for(int i=0; i < list.size(); i++){
        if(_bstop){     // 线程停止逻辑
            return ;
        }

        QFileInfo fileInfo = list.at(i);
        bool bIsDir = fileInfo.isDir();     // 判断是否为目录
        if(bIsDir){
            if(_bstop){
                return ;
            }
            file_count++;
            emit SigUpdateProgress(file_count);

            QDir dist_dir(_dist_path);      // 目的路径
            QString sub_dist_path = dist_dir.absoluteFilePath(fileInfo.fileName()); // 子文件夹路劲
            QDir sub_dist_dir(sub_dist_path);
            if(!sub_dist_dir.exists()){    // 如果子文件夹路径不存在，则创建路径
                bool ok = sub_dist_dir.mkpath(sub_dist_path);
                if(!ok){        // 创建失败
                    continue;
                }
            }

            auto *item = new ProTreeItem(parent_item, fileInfo.fileName(), sub_dist_path, root, TreeItemDir);
            item->setData(0,Qt::DisplayRole, fileInfo.fileName());
            item->setData(0,Qt::DecorationRole, QIcon(":/icon/direction.png"));
            item->setData(0,Qt::ToolTipRole, sub_dist_path);       // 提示文件的路径信息

            qDebug() << "CreateProTree(fileInfo.absoluteFilePath(), sub_dist_path, item, file_count, self, root, preItem); ";
            CreateProTree(fileInfo.absoluteFilePath(), sub_dist_path, item, file_count, self, root, preItem);       // 递归调用创建文件

        }else{
            if(_bstop){
                return ;
            }

            const QString& suffix = fileInfo.completeSuffix();      // 后缀
            if(suffix != "png" && suffix != "jpg" && suffix != "jpeg"){
                continue;
            }
            file_count++;
            emit SigUpdateProgress(file_count);     // 发送文件数量更新信号
            if(!needcopy){
                continue;
            }

            QDir dist_dir(dist_path);
            QString dist_file_path = dist_dir.absoluteFilePath(fileInfo.fileName());
            if(!QFile::copy(fileInfo.absoluteFilePath(), dist_file_path)){        // 判断拷贝是否失败
                qDebug() << "copy is failed";
                continue;
            }

            auto *item = new ProTreeItem(parent_item, fileInfo.fileName(), dist_file_path, root, TreeItemPic);
            item->setData(0,Qt::DisplayRole, fileInfo.fileName());
            item->setData(0,Qt::DecorationRole, QIcon(":/icon/pic.png"));
            item->setData(0,Qt::ToolTipRole, dist_file_path);       // 提示文件的路径信息

            //  实现双向链表
            if(preItem){
                auto * pre_proitem = dynamic_cast<ProTreeItem*>(preItem);
                pre_proitem->setNextItem(item);         // 如果前一个结点 preItem 不为空，则把item设置为他的下一个结点
            }
            item->setPreItem(preItem);      // 把 preItem 设置为 item的前一个结点
            preItem = item;
        }
    }
}

void ProTreeThread::SlotCancelProgress()
{
    this->_bstop = true;
}
